fontFeatures
fontFeatures copied to clipboard
Fix failing test in test_anchors
As you may notice we still have a test fail. I'm not sure how to fix it as the results are identical, markClass names shouldn't matter to a roundtrip?
There's a very similar looking failure in test_fea_parser.py:
_______________________ test_round_trip[mark_attachment] _______________________
s = 'markClass [acute grave] <anchor 150 -10> @TOP_MARKS;\n lookup dummy {\n pos base [a e o u] <anchor 250 450> mark @TOP_MARKS;\n } dummy;\n '
@pytest.mark.parametrize("s", [
# pytest.param("lookup dummy { } dummy;", id="single_dummy"),
# pytest.param("lookup dummy1 { } dummy1; lookup dummy2 { } dummy2;", id="double_dummy"),
pytest.param("lookup dummy { sub a by b; } dummy;", id="single_subst"),
pytest.param("lookup dummy { sub x a' y by b; } dummy;", id="single_marked_subst"),
pytest.param("lookup dummy { sub [a b] by [d e]; } dummy;", id="single_group_subst"),
pytest.param("lookup dummy { sub [a b]' y by [d e]; } dummy;", id="single_marked_group_subst"),
pytest.param("lookup dummy { sub one two [a b]' y by [d e]; } dummy;", id="single_prepost_1"),
pytest.param("lookup dummy { sub [one two] [a b]' y by [d e]; } dummy;", id="single_prepost_2"),
pytest.param("lookup dummy { sub f_f_i by f f i; } dummy;", id="decomposition"),
pytest.param("lookup dummy { sub f_f_i' x by f f i; } dummy;", id="decomposition_marked"),
pytest.param("lookup dummy { sub [a b] f_f_i' x by f f i; } dummy;", id="decomposition_context"),
pytest.param("lookup dummy { sub ampersand from [ampersand.1 ampersand.2 ampersand.3]; } dummy;", id="alternate"),
pytest.param("lookup dummy { sub x ampersand' from [ampersand.1 ampersand.2 ampersand.3]; } dummy;", id="contextual_alternate"),
pytest.param("lookup dummy { sub [one one.oldstyle] [slash fraction] [two two.oldstyle] by onehalf; } dummy;",id="fraction"),
pytest.param("lookup dummy { sub [o u] f' f' by f_f; } dummy;",id="marked_ligature"),
pytest.param("lookup dummy { sub [e e.begin]' t' c by ampersand; } dummy;",id="contextual"),
pytest.param("lookup dummy { sub a by b; } dummy; lookup chain { sub a' lookup dummy; } chain; ",id="chain"),
pytest.param("lookup dummy { sub a by b; } dummy; lookup chain { sub x [one two] a' lookup dummy b' lookup dummy; } chain; ",id="chain2"),
pytest.param("lookup dummy { rsub a b' c by d; } dummy; ",id="rsub"),
pytest.param("lookup dummy { ignore sub a d' d; } dummy; ",id="ignore"),
pytest.param("lookup a { sub a by b; sub c by d; } a; feature calt { lookup a; } calt;",id="feature"),
pytest.param("lookup dummy { pos one <-80 0 -160 0>; } dummy;",id="pos_one"),
pytest.param("lookup dummy { pos [one two] <-80 0 -160 0>; } dummy;",id="pos_one_group"),
pytest.param("lookup dummy { pos a [one two]' <-80 0 -160 0>; } dummy;",id="pos_one_contexual"),
pytest.param("lookup dummy { pos s f' 10 t; } dummy;",id="pos_one_contextual_alt_format"),
pytest.param("lookup dummy { pos T -60 a <-40 0 -40 0>; } dummy;",id="pos_two"),
pytest.param("lookup dummy { pos [X Y] -60 a <-40 0 -40 0>; } dummy;",id="pos_two_group"),
pytest.param("lookup dummy { pos T a -100; } dummy;",id="pos_two_one_null"),
pytest.param("lookup dummy { pos cursive meem.medial <anchor 500 20> <anchor 0 -20>; } dummy;",id="pos_cursive1"),
pytest.param("lookup dummy { pos cursive meem.init <anchor NULL> <anchor 0 -20>; } dummy;",id="pos_cursive2"),
pytest.param(
"""markClass [acute grave] <anchor 150 -10> @TOP_MARKS;
lookup dummy {
pos base [a e o u] <anchor 250 450> mark @TOP_MARKS;
} dummy;
""", id="mark_attachment"
),
pytest.param("lookup dummy { pos X [A B]' -40 B' -40 A' -40 Y; } dummy;", id="pos_contextual"),
# pytest.param("lookup dummy { sub a b by c; } dummy; feature calt { lookup dummy; } calt;", id="lookup_reference"),
pytest.param("lookup dummy { lookupflag IgnoreMarks; sub a b by c; } dummy;", id="lookup_flag"),
# pytest.param("feature calt { lookupflag IgnoreMarks; sub a b by c; } calt;", id="flag_in_feature"),
# pytest.param("feature calt { sub x by y; lookupflag IgnoreMarks; sub a b by c; } calt;", id="switch_flags"),
])
def test_round_trip(s):
parser = FeaParser(s)
parser.parse()
> assertSufficientlyEqual(parser.ff.asFea(), s)
tests/test_fea_parser.py:66:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
s1 = 'table GDEF {\n GlyphClassDef [], [], [], [];\n} GDEF;\n\n markClass [acute grave] <anchor 150 -10> @TOP_MARKS_T...<features>:3:3 \n pos base [a e o u]\n <anchor 250 450> mark @TOP_MARKS_TOP_MARKS;\n\n} dummy;\n'
s2 = 'markClass [acute grave] <anchor 150 -10> @TOP_MARKS;\n lookup dummy {\n pos base [a e o u] <anchor 250 450> mark @TOP_MARKS;\n } dummy;\n '
def assertSufficientlyEqual(s1, s2):
def alltrim(a):
a = re.sub("lookupflag 0;", "", a)
a = re.sub("#.*", "", a)
a = re.sub("\\s+", " ", a)
a = re.sub("table GDEF.*GDEF;", "", a)
a = re.sub(" ; ", " ", a)
return a.strip()
> assert alltrim(s1) == alltrim(s2)
E AssertionError: assert 'markClass [a...RKS; } dummy;' == 'markClass [a...RKS; } dummy;'
E Skipping 41 identical leading characters in diff, use -v to show
E - @TOP_MARKS; lookup dummy { pos base [a e o u] <anchor 250 450> mark @TOP_MARKS; } dummy;
E + @TOP_MARKS_TOP_MARKS; lookup dummy { pos base [a e o u] <anchor 250 450> mark @TOP_MARKS_TOP_MARKS; } dummy;
E ? ++++++++++ ++++++++++
tests/test_fea_parser.py:17: AssertionError