blob: 8708f704829b038862c33dba3feff131e4293e4c [file] [log] [blame]
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"
)