151 lines
4.9 KiB
Python
151 lines
4.9 KiB
Python
|
import shutil
|
||
|
from pathlib import Path
|
||
|
|
||
|
import pytest
|
||
|
from fontTools.designspaceLib import DesignSpaceDocument
|
||
|
from fontTools.designspaceLib.split import splitInterpolable, splitVariableFonts, convert5to4
|
||
|
|
||
|
from .fixtures import datadir
|
||
|
|
||
|
UPDATE_REFERENCE_OUT_FILES_INSTEAD_OF_TESTING = False
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize(
|
||
|
"test_ds,expected_interpolable_spaces",
|
||
|
[
|
||
|
(
|
||
|
"test_v5_aktiv.designspace",
|
||
|
[
|
||
|
(
|
||
|
{},
|
||
|
{
|
||
|
"AktivGroteskVF_Italics_Wght",
|
||
|
"AktivGroteskVF_Italics_WghtWdth",
|
||
|
"AktivGroteskVF_Wght",
|
||
|
"AktivGroteskVF_WghtWdth",
|
||
|
"AktivGroteskVF_WghtWdthItal",
|
||
|
},
|
||
|
)
|
||
|
],
|
||
|
),
|
||
|
(
|
||
|
"test_v5_sourceserif.designspace",
|
||
|
[
|
||
|
(
|
||
|
{"italic": 0},
|
||
|
{"SourceSerif4Variable-Roman"},
|
||
|
),
|
||
|
(
|
||
|
{"italic": 1},
|
||
|
{"SourceSerif4Variable-Italic"},
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
(
|
||
|
"test_v5_MutatorSans_and_Serif.designspace",
|
||
|
[
|
||
|
(
|
||
|
{"serif": 0},
|
||
|
{
|
||
|
"MutatorSansVariable_Weight_Width",
|
||
|
"MutatorSansVariable_Weight",
|
||
|
"MutatorSansVariable_Width",
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
{"serif": 1},
|
||
|
{
|
||
|
"MutatorSerifVariable_Width",
|
||
|
},
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
],
|
||
|
)
|
||
|
def test_split(datadir, tmpdir, test_ds, expected_interpolable_spaces):
|
||
|
data_in = datadir / test_ds
|
||
|
temp_in = Path(tmpdir) / test_ds
|
||
|
shutil.copy(data_in, temp_in)
|
||
|
doc = DesignSpaceDocument.fromfile(temp_in)
|
||
|
|
||
|
for i, (location, sub_doc) in enumerate(splitInterpolable(doc)):
|
||
|
expected_location, expected_vf_names = expected_interpolable_spaces[i]
|
||
|
assert location == expected_location
|
||
|
vfs = list(splitVariableFonts(sub_doc))
|
||
|
assert expected_vf_names == set(vf[0] for vf in vfs)
|
||
|
|
||
|
loc_str = "_".join(f"{name}_{value}"for name, value in sorted(location.items()))
|
||
|
data_out = datadir / "split_output" / f"{temp_in.stem}_{loc_str}.designspace"
|
||
|
temp_out = Path(tmpdir) / "out" / f"{temp_in.stem}_{loc_str}.designspace"
|
||
|
temp_out.parent.mkdir(exist_ok=True)
|
||
|
sub_doc.write(temp_out)
|
||
|
|
||
|
if UPDATE_REFERENCE_OUT_FILES_INSTEAD_OF_TESTING:
|
||
|
data_out.write_text(temp_out.read_text(encoding="utf-8"), encoding="utf-8")
|
||
|
else:
|
||
|
assert data_out.read_text(encoding="utf-8") == temp_out.read_text(
|
||
|
encoding="utf-8"
|
||
|
)
|
||
|
|
||
|
for vf_name, vf_doc in vfs:
|
||
|
data_out = (datadir / "split_output" / vf_name).with_suffix(".designspace")
|
||
|
temp_out = (Path(tmpdir) / "out" / vf_name).with_suffix(".designspace")
|
||
|
temp_out.parent.mkdir(exist_ok=True)
|
||
|
vf_doc.write(temp_out)
|
||
|
|
||
|
if UPDATE_REFERENCE_OUT_FILES_INSTEAD_OF_TESTING:
|
||
|
data_out.write_text(
|
||
|
temp_out.read_text(encoding="utf-8"), encoding="utf-8"
|
||
|
)
|
||
|
else:
|
||
|
assert data_out.read_text(encoding="utf-8") == temp_out.read_text(
|
||
|
encoding="utf-8"
|
||
|
)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
@pytest.mark.parametrize(
|
||
|
"test_ds,expected_vfs",
|
||
|
[
|
||
|
(
|
||
|
"test_v5_aktiv.designspace",
|
||
|
{
|
||
|
"AktivGroteskVF_Italics_Wght",
|
||
|
"AktivGroteskVF_Italics_WghtWdth",
|
||
|
"AktivGroteskVF_Wght",
|
||
|
"AktivGroteskVF_WghtWdth",
|
||
|
"AktivGroteskVF_WghtWdthItal",
|
||
|
},
|
||
|
),
|
||
|
(
|
||
|
"test_v5_sourceserif.designspace",
|
||
|
{
|
||
|
"SourceSerif4Variable-Italic",
|
||
|
"SourceSerif4Variable-Roman",
|
||
|
},
|
||
|
),
|
||
|
],
|
||
|
)
|
||
|
def test_convert5to4(datadir, tmpdir, test_ds, expected_vfs):
|
||
|
data_in = datadir / test_ds
|
||
|
temp_in = tmpdir / test_ds
|
||
|
shutil.copy(data_in, temp_in)
|
||
|
doc = DesignSpaceDocument.fromfile(temp_in)
|
||
|
|
||
|
variable_fonts = convert5to4(doc)
|
||
|
|
||
|
assert variable_fonts.keys() == expected_vfs
|
||
|
for vf_name, vf in variable_fonts.items():
|
||
|
data_out = (datadir / "convert5to4_output" / vf_name).with_suffix(".designspace")
|
||
|
temp_out = (Path(tmpdir) / "out" / vf_name).with_suffix(".designspace")
|
||
|
temp_out.parent.mkdir(exist_ok=True)
|
||
|
vf.write(temp_out)
|
||
|
|
||
|
if UPDATE_REFERENCE_OUT_FILES_INSTEAD_OF_TESTING:
|
||
|
data_out.write_text(temp_out.read_text(encoding="utf-8"), encoding="utf-8")
|
||
|
else:
|
||
|
assert data_out.read_text(encoding="utf-8") == temp_out.read_text(
|
||
|
encoding="utf-8"
|
||
|
)
|