File: test_fea_parser.py

package info (click to toggle)
python-fontfeatures 1.9.0%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,096 kB
  • sloc: python: 9,112; makefile: 22
file content (141 lines) | stat: -rw-r--r-- 5,285 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
from fontFeatures import Substitution
from fontFeatures.feaLib import FeaParser

import pytest

import re


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)


@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)


# Mark to mark
# Mark to lig
# Ignore pos
# Languages