File: test_basic.py

package info (click to toggle)
ufomerge 1.9.6-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 224 kB
  • sloc: python: 1,445; makefile: 3
file content (167 lines) | stat: -rw-r--r-- 5,188 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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
from ufomerge import merge_ufos
from ufoLib2.objects.component import Component
from ufoLib2.objects.anchor import Anchor


def test_glyphset(helpers):
    ufo1 = helpers.create_ufo(["A", "B"])
    ufo2 = helpers.create_ufo(["C", "D"])
    merge_ufos(ufo1, ufo2)
    helpers.assert_glyphset(ufo1, ["A", "B", "C", "D"])


def test_component_closure(helpers):
    ufo1 = helpers.create_ufo(["A", "B"])
    ufo2 = helpers.create_ufo(["C", "D", "comp"])

    ufo2["D"].components.append(Component("comp"))

    merge_ufos(ufo1, ufo2, glyphs=["D"])

    helpers.assert_glyphset(ufo1, ["A", "B", "D", "comp"])


def test_kerning_flat(helpers):
    ufo1 = helpers.create_ufo(["A", "B"])
    ufo2 = helpers.create_ufo(["C", "D", "E"])
    ufo2.kerning = {
        ("C", "D"): 20,
        ("C", "E"): 15,
        ("C", "A"): -20,  # I can foresee some dispute about what this should do
    }

    merge_ufos(ufo1, ufo2, glyphs=["C", "D"])

    assert ufo1.kerning == {
        ("C", "D"): 20,
        ("C", "A"): -20,
    }


def test_existing_handling(helpers):
    ufo1 = helpers.create_ufo(["A", "B"])
    ufo1["B"].width = 100
    ufo2 = helpers.create_ufo(["B", "C"])
    ufo2["B"].width = 200
    merge_ufos(ufo1, ufo2, existing_handling="skip")
    assert ufo1["B"].width == 100
    merge_ufos(ufo1, ufo2, existing_handling="replace")
    assert ufo1["B"].width == 200


def test_existing_handling_dict(helpers):
    ufo1 = helpers.create_ufo(["A", "B", "C", "D"])
    ufo1["B"].width = 100
    ufo1["C"].width = 100
    ufo1["D"].width = 100
    ufo2 = helpers.create_ufo(["B", "C", "D"])
    ufo2["B"].width = 200
    ufo2["C"].width = 200
    ufo2["D"].width = 200
    merge_ufos(
        ufo1,
        ufo2,
        existing_handling={"B": "skip", "C": "replace", "DEFAULT": "replace"},
    )
    assert ufo1["B"].width == 100
    assert ufo1["C"].width == 200
    assert ufo1["D"].width == 200


def test_kerning_groups(helpers):
    """Test that groups and kerning pairs of ufo1 are dropped if they reference
    any imported glyphs.

    This avoids stray kerning and glyphs being memebers of more than one group.
    """
    ufo1 = helpers.create_ufo(["A", "B"])
    ufo1.groups["public.kern1.foo"] = ["A"]
    ufo1.groups["public.kern2.foo"] = ["A"]
    ufo1.kerning[("public.kern1.foo", "public.kern2.foo")] = 10
    ufo1.kerning[("public.kern1.foo", "B")] = 20
    ufo1.kerning[("A", "public.kern2.foo")] = 30
    ufo1.kerning[("A", "A")] = 40
    ufo2 = helpers.create_ufo(["A", "B"])
    ufo2.groups["public.kern1.bar"] = ["A"]
    ufo2.groups["public.kern2.bar"] = ["A"]
    ufo2.kerning[("public.kern1.bar", "public.kern2.bar")] = 50
    ufo2.kerning[("public.kern1.bar", "B")] = 60
    ufo2.kerning[("A", "public.kern2.bar")] = 70
    ufo2.kerning[("A", "A")] = 80

    merge_ufos(ufo1, ufo2)
    assert ufo1.groups == {
        "public.kern1.bar": ["A"],
        "public.kern2.bar": ["A"],
    }
    assert ufo1.kerning == {
        ("public.kern1.bar", "public.kern2.bar"): 50,
        ("public.kern1.bar", "B"): 60,
        ("A", "public.kern2.bar"): 70,
        ("A", "A"): 80,
    }


def test_dotted_circle(helpers):
    """Test that anchors are merged if both fonts contain a dotted circle glyph."""
    ufo1 = helpers.create_ufo(["A", "B", "dottedCircle"])
    ufo1["dottedCircle"].appendAnchor(Anchor(0, 100, "top"))
    ufo2 = helpers.create_ufo(["A", "B", "dottedCircle"])
    ufo2["dottedCircle"].appendAnchor(Anchor(0, -100, "bottom"))

    merge_ufos(ufo1, ufo2, merge_dotted_circle_anchors=False)
    assert set(a.name for a in ufo1["dottedCircle"].anchors) == {
        "bottom"
    }  # We replaced.

    ufo1 = helpers.create_ufo(["A", "B", "dottedCircle"])
    ufo1["dottedCircle"].appendAnchor(Anchor(0, 100, "top"))
    ufo2 = helpers.create_ufo(["A", "B", "dottedCircle"])
    ufo2["dottedCircle"].appendAnchor(Anchor(0, -100, "bottom"))

    merge_ufos(ufo1, ufo2, merge_dotted_circle_anchors=True)
    assert set(a.name for a in ufo1["dottedCircle"].anchors) == {"top", "bottom"}


def test_28(helpers):
    ufo1 = helpers.create_ufo(["A", "B"])
    b1 = ufo1["B"]
    b1.height = 100
    b1.unicodes = [0x42]

    ufo2 = helpers.create_ufo(["B", "C"])
    b2 = ufo2["B"]
    b2.height = 200
    b2.unicodes = [0x42]

    merge_ufos(
        ufo1,
        ufo2,
        exclude_glyphs=["B"],
        codepoints=[0x42],
    )

    assert "B" in ufo1
    assert ufo1["B"].height == 100
    assert ufo1["B"].unicode == 0x42  # fails


def test_glyphorder(helpers):
    ufo1 = helpers.create_ufo(["A", "B", "C"])
    ufo1.lib["public.glyphOrder"] = ["A", "B", "C"]
    ufo2 = helpers.create_ufo(["D", "E"])
    ufo2.lib["public.glyphOrder"] = ["D", "E"]

    merge_ufos(ufo1, ufo2)

    assert ufo1.lib.get("public.glyphOrder") == ["A", "B", "C", "D", "E"]

    # But what if the glyphOrder is not the ORDER OF THE GLYPHS?!
    ufo3 = helpers.create_ufo(["A", "B", "C"])
    ufo3.lib["public.glyphOrder"] = ["A", "B", "C"]
    ufo4 = helpers.create_ufo(["C", "D", "E"])
    ufo4.lib["public.glyphOrder"] = ["C", "E", "D"]

    merge_ufos(ufo3, ufo4, existing_handling="replace")

    assert ufo3.lib.get("public.glyphOrder") == ["A", "B", "C", "E", "D"]