aboutsummaryrefslogtreecommitdiff
path: root/Tests/varLib/featureVars_test.py
blob: 89675af2e7555648da370fbeb98d6b4610cc01f4 (plain)
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
from fontTools.varLib.featureVars import (
    overlayFeatureVariations)


def test_linear(n = 10):
    conds = []
    for i in range(n):
        end = i / n
        start = end - 1.
        region = [{'X': (start, end)}]
        subst = {'g%.2g'%start: 'g%.2g'%end}
        conds.append((region, subst))
    overlaps = overlayFeatureVariations(conds)
    assert len(overlaps) == 2 * n - 1, overlaps
    return conds, overlaps

def test_quadratic(n = 10):
    conds = []
    for i in range(1, n + 1):
        region = [{'X': (0, i / n),
                   'Y': (0, (n + 1 - i) / n)}]
        subst = {str(i): str(n + 1 - i)}
        conds.append((region, subst))
    overlaps = overlayFeatureVariations(conds)
    assert len(overlaps) == n * (n + 1) // 2, overlaps
    return conds, overlaps

def _merge_substitutions(substitutions):
    merged = {}
    for subst in substitutions:
        merged.update(subst)
    return merged

def _match_condition(location, overlaps):
    for box, substitutions in overlaps:
        for tag, coord in location.items():
            start, end = box[tag]
            if start <= coord <= end:
                return _merge_substitutions(substitutions)
    return {}  # no match

def test_overlaps_1():
    # https://github.com/fonttools/fonttools/issues/1400
    conds = [
        ([{'abcd': (4, 9)}], {0: 0}),
        ([{'abcd': (5, 10)}], {1: 1}),
        ([{'abcd': (0, 8)}], {2: 2}),
        ([{'abcd': (3, 7)}], {3: 3}),
    ]
    overlaps = overlayFeatureVariations(conds)
    subst = _match_condition({'abcd': 0}, overlaps)
    assert subst == {2: 2}
    subst = _match_condition({'abcd': 1}, overlaps)
    assert subst == {2: 2}
    subst = _match_condition({'abcd': 3}, overlaps)
    assert subst == {2: 2, 3: 3}
    subst = _match_condition({'abcd': 4}, overlaps)
    assert subst == {0: 0, 2: 2, 3: 3}
    subst = _match_condition({'abcd': 5}, overlaps)
    assert subst == {0: 0, 1: 1, 2: 2, 3: 3}
    subst = _match_condition({'abcd': 7}, overlaps)
    assert subst == {0: 0, 1: 1, 2: 2, 3: 3}
    subst = _match_condition({'abcd': 8}, overlaps)
    assert subst == {0: 0, 1: 1, 2: 2}
    subst = _match_condition({'abcd': 9}, overlaps)
    assert subst == {0: 0, 1: 1}
    subst = _match_condition({'abcd': 10}, overlaps)
    assert subst == {1: 1}

def test_overlaps_2():
    # https://github.com/fonttools/fonttools/issues/1400
    conds = [
        ([{'abcd': (1, 9)}], {0: 0}),
        ([{'abcd': (8, 10)}], {1: 1}),
        ([{'abcd': (3, 4)}], {2: 2}),
        ([{'abcd': (1, 10)}], {3: 3}),
    ]
    overlaps = overlayFeatureVariations(conds)
    subst = _match_condition({'abcd': 0}, overlaps)
    assert subst == {}
    subst = _match_condition({'abcd': 1}, overlaps)
    assert subst == {0: 0, 3: 3}
    subst = _match_condition({'abcd': 2}, overlaps)
    assert subst == {0: 0, 3: 3}
    subst = _match_condition({'abcd': 3}, overlaps)
    assert subst == {0: 0, 2: 2, 3: 3}
    subst = _match_condition({'abcd': 5}, overlaps)
    assert subst == {0: 0, 3: 3}
    subst = _match_condition({'abcd': 10}, overlaps)
    assert subst == {1: 1, 3: 3}


def run(test, n, quiet):

    print()
    print("%s:" % test.__name__)
    input, output = test(n)
    if quiet:
        print(len(output))
    else:
        print()
        print("Input:")
        pprint(input)
        print()
        print("Output:")
        pprint(output)
        print()

if __name__ == "__main__":
    import sys
    from pprint import pprint
    quiet = False
    n = 3
    if len(sys.argv) > 1 and sys.argv[1] == '-q':
        quiet = True
        del sys.argv[1]
    if len(sys.argv) > 1:
        n = int(sys.argv[1])

    run(test_linear, n=n, quiet=quiet)
    run(test_quadratic, n=n, quiet=quiet)