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"]
|