instancer_test: make new test font with FeatureVariations

instead of reading off existing FeatureVars.ttx test file.
This gives us more flexibility to add more tests, and keeps the input
values closer to the expected results
This commit is contained in:
Cosimo Lupo 2019-05-30 12:35:44 +01:00
parent afc194db19
commit 874947c00b
No known key found for this signature in database
GPG Key ID: 20D4A261E4A0E642

View File

@ -10,6 +10,7 @@ from fontTools import varLib
from fontTools.varLib import instancer from fontTools.varLib import instancer
from fontTools.varLib.mvar import MVAR_ENTRIES from fontTools.varLib.mvar import MVAR_ENTRIES
from fontTools.varLib import builder from fontTools.varLib import builder
from fontTools.varLib import featureVars
from fontTools.varLib import models from fontTools.varLib import models
from fontTools.misc.loggingTools import CapturingLogHandler from fontTools.misc.loggingTools import CapturingLogHandler
import collections import collections
@ -1149,23 +1150,6 @@ class InstantiateVariableFontTest(object):
assert _dump_ttx(instance) == expected assert _dump_ttx(instance) == expected
@pytest.fixture
def varfont3():
# The test file "Tests/varLib/data/test_results/FeatureVars.ttx" contains
# a GSUB.FeatureVariations table built from conditional rules specified in
# "Tests/varLib/data/FeatureVars.designspace" file, which are equivalent to:
#
# conditionalSubstitutions = [
# ([{"wght": (0.20886, 1.0)}], {"uni0024": "uni0024.nostroke"}),
# ([{"cntr": (0.75, 1.0)}], {"uni0041": "uni0061"}),
# ([{"wght": (-1.0, -0.45654), "cntr": (0, 0.25)}], {"uni0061": "uni0041"}),
# ]
ttx = os.path.join(TESTDATA, "test_results", "FeatureVars.ttx")
font = ttLib.TTFont(recalcBBoxes=False, recalcTimestamp=False)
font.importXML(ttx)
return font
def _conditionSetAsDict(conditionSet, axisOrder): def _conditionSetAsDict(conditionSet, axisOrder):
result = {} result = {}
for cond in conditionSet.ConditionTable: for cond in conditionSet.ConditionTable:
@ -1184,6 +1168,29 @@ def _getSubstitutions(gsub, lookupIndices):
return subs return subs
def makeFeatureVarsFont(conditionalSubstitutions):
axes = set()
glyphs = set()
for region, substitutions in conditionalSubstitutions:
for box in region:
axes.update(box.keys())
glyphs.update(*substitutions.items())
varfont = ttLib.TTFont()
varfont.setGlyphOrder(sorted(glyphs))
fvar = varfont["fvar"] = ttLib.newTable("fvar")
fvar.axes = []
for axisTag in sorted(axes):
axis = _f_v_a_r.Axis()
axis.axisTag = Tag(axisTag)
fvar.axes.append(axis)
featureVars.addFeatureVariations(varfont, conditionalSubstitutions)
return varfont
class InstantiateFeatureVariationsTest(object): class InstantiateFeatureVariationsTest(object):
@pytest.mark.parametrize( @pytest.mark.parametrize(
"location, appliedSubs, expectedRecords", "location, appliedSubs, expectedRecords",
@ -1227,8 +1234,17 @@ class InstantiateFeatureVariationsTest(object):
), ),
], ],
) )
def test_partial_instance(self, varfont3, location, appliedSubs, expectedRecords): def test_partial_instance(self, location, appliedSubs, expectedRecords):
font = varfont3 font = makeFeatureVarsFont(
[
([{"wght": (0.20886, 1.0)}], {"uni0024": "uni0024.nostroke"}),
([{"cntr": (0.75, 1.0)}], {"uni0041": "uni0061"}),
(
[{"wght": (-1.0, -0.45654), "cntr": (0, 0.25)}],
{"uni0061": "uni0041"},
),
]
)
instancer.instantiateFeatureVariations(font, location) instancer.instantiateFeatureVariations(font, location)
@ -1268,8 +1284,17 @@ class InstantiateFeatureVariationsTest(object):
({"wght": -1.0, "cntr": 0.3}, None), ({"wght": -1.0, "cntr": 0.3}, None),
], ],
) )
def test_full_instance(self, varfont3, location, appliedSubs): def test_full_instance(self, location, appliedSubs):
font = varfont3 font = makeFeatureVarsFont(
[
([{"wght": (0.20886, 1.0)}], {"uni0024": "uni0024.nostroke"}),
([{"cntr": (0.75, 1.0)}], {"uni0041": "uni0061"}),
(
[{"wght": (-1.0, -0.45654), "cntr": (0, 0.25)}],
{"uni0061": "uni0041"},
),
]
)
instancer.instantiateFeatureVariations(font, location) instancer.instantiateFeatureVariations(font, location)
@ -1282,14 +1307,22 @@ class InstantiateFeatureVariationsTest(object):
else: else:
assert not gsub.FeatureList.FeatureRecord assert not gsub.FeatureList.FeatureRecord
def test_unsupported_condition_format(self, varfont3): def test_unsupported_condition_format(self):
gsub = varfont3["GSUB"].table font = makeFeatureVarsFont(
[
(
[{"wdth": (-1.0, -0.5), "wght": (0.5, 1.0)}],
{"dollar": "dollar.nostroke"},
)
]
)
gsub = font["GSUB"].table
featureVariations = gsub.FeatureVariations featureVariations = gsub.FeatureVariations
rec1 = featureVariations.FeatureVariationRecord[0] rec1 = featureVariations.FeatureVariationRecord[0]
rec1.ConditionSet.ConditionTable[0].Format = 2 rec1.ConditionSet.ConditionTable[0].Format = 2
with CapturingLogHandler("fontTools.varLib.instancer", "WARNING") as captor: with CapturingLogHandler("fontTools.varLib.instancer", "WARNING") as captor:
instancer.instantiateFeatureVariations(varfont3, {"wght": 0}) instancer.instantiateFeatureVariations(font, {"wght": 0})
captor.assertRegex( captor.assertRegex(
r"Condition table 0 of FeatureVariationRecord 0 " r"Condition table 0 of FeatureVariationRecord 0 "