fonttools/Tests/varLib/stat_test.py

227 lines
6.9 KiB
Python

from pathlib import Path
import pytest
from fontTools.designspaceLib import DesignSpaceDocument
from fontTools.designspaceLib.split import Range
from fontTools.ttLib import TTFont, newTable
from fontTools.varLib.stat import buildVFStatTable, getStatAxes, getStatLocations
@pytest.fixture
def datadir():
return Path(__file__).parent / "../designspaceLib/data"
def test_getStatAxes(datadir):
doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
assert getStatAxes(
doc, {"Italic": 0, "Width": Range(50, 150), "Weight": Range(200, 900)}
) == [
{
"values": [
{
"flags": 0,
"name": {
"de": "Extraleicht",
"en": "Extra Light",
"fr": "Extra léger",
},
"nominalValue": 200.0,
"rangeMaxValue": 250.0,
"rangeMinValue": 200.0,
},
{
"flags": 0,
"name": {"en": "Light"},
"nominalValue": 300.0,
"rangeMaxValue": 350.0,
"rangeMinValue": 250.0,
},
{
"flags": 2,
"name": {"en": "Regular"},
"nominalValue": 400.0,
"rangeMaxValue": 450.0,
"rangeMinValue": 350.0,
},
{
"flags": 0,
"name": {"en": "Semi Bold"},
"nominalValue": 600.0,
"rangeMaxValue": 650.0,
"rangeMinValue": 450.0,
},
{
"flags": 0,
"name": {"en": "Bold"},
"nominalValue": 700.0,
"rangeMaxValue": 850.0,
"rangeMinValue": 650.0,
},
{
"flags": 0,
"name": {"en": "Black"},
"nominalValue": 900.0,
"rangeMaxValue": 900.0,
"rangeMinValue": 850.0,
},
{
"flags": 2,
"name": {"en": "Regular"},
"value": 400.0,
"linkedValue": 700.0,
},
{
"flags": 0,
"name": {"en": "Bold"},
"value": 700.0,
"linkedValue": 400.0,
},
],
"name": {"en": "Wéíght", "fa-IR": "قطر"},
"ordering": 2,
"tag": "wght",
},
{
"values": [
{"flags": 0, "name": {"en": "Condensed"}, "value": 50.0},
{"flags": 3, "name": {"en": "Normal"}, "value": 100.0},
{"flags": 0, "name": {"en": "Wide"}, "value": 125.0},
{
"flags": 0,
"name": {"en": "Extra Wide"},
"nominalValue": 150.0,
"rangeMinValue": 150.0,
},
],
"name": {"en": "Width", "fr": "Chasse"},
"ordering": 1,
"tag": "wdth",
},
{
"values": [
{"flags": 2, "linkedValue": 1.0, "name": {"en": "Roman"}, "value": 0.0},
],
"name": {"en": "Italic"},
"ordering": 3,
"tag": "ital",
},
]
assert getStatAxes(doc, {"Italic": 1, "Width": 100, "Weight": Range(400, 700)}) == [
{
"values": [
{
"flags": 2,
"name": {"en": "Regular"},
"nominalValue": 400.0,
"rangeMaxValue": 450.0,
"rangeMinValue": 350.0,
},
{
"flags": 0,
"name": {"en": "Semi Bold"},
"nominalValue": 600.0,
"rangeMaxValue": 650.0,
"rangeMinValue": 450.0,
},
{
"flags": 0,
"name": {"en": "Bold"},
"nominalValue": 700.0,
"rangeMaxValue": 850.0,
"rangeMinValue": 650.0,
},
{
"flags": 2,
"name": {"en": "Regular"},
"value": 400.0,
"linkedValue": 700.0,
},
{
"flags": 0,
"name": {"en": "Bold"},
"value": 700.0,
"linkedValue": 400.0,
},
],
"name": {"en": "Wéíght", "fa-IR": "قطر"},
"ordering": 2,
"tag": "wght",
},
{
"values": [
{"flags": 3, "name": {"en": "Normal"}, "value": 100.0},
],
"name": {"en": "Width", "fr": "Chasse"},
"ordering": 1,
"tag": "wdth",
},
{
"values": [
{"flags": 0, "name": {"en": "Italic"}, "value": 1.0},
],
"name": {"en": "Italic"},
"ordering": 3,
"tag": "ital",
},
]
def test_getStatLocations(datadir):
doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
assert getStatLocations(
doc, {"Italic": 0, "Width": Range(50, 150), "Weight": Range(200, 900)}
) == [
{
"flags": 0,
"location": {"ital": 0.0, "wdth": 50.0, "wght": 300.0},
"name": {"en": "Some Style", "fr": "Un Style"},
},
]
assert getStatLocations(
doc, {"Italic": 1, "Width": Range(50, 150), "Weight": Range(200, 900)}
) == [
{
"flags": 0,
"location": {"ital": 1.0, "wdth": 100.0, "wght": 700.0},
"name": {"en": "Other"},
},
]
@pytest.mark.parametrize(
"with_mac_names",
[
pytest.param(True, id="with_mac_names"),
pytest.param(False, id="without_mac_names"),
],
)
def test_buildVFStatTable(datadir, with_mac_names):
doc = DesignSpaceDocument.fromfile(datadir / "test_v5.designspace")
ttFont = TTFont()
nameTable = newTable("name")
nameTable.names = []
ttFont["name"] = nameTable
if with_mac_names:
# addName adds a name string for both Macintosh and Windows platforms by default
nameTable.addName("Regular")
buildVFStatTable(ttFont, doc, vfName="Test_WghtWdth")
assert "STAT" in ttFont
name_recs = ttFont["name"].names
assert len({nr.nameID for nr in name_recs}) == 15
# test that mac names don't get added if there weren't any before
mac_recs = [nr for nr in name_recs if nr.platformID == 1]
if with_mac_names:
assert len(mac_recs) > 1
else:
assert len(mac_recs) == 0