diff options
Diffstat (limited to 'Tests/designspaceLib/split_test.py')
-rw-r--r-- | Tests/designspaceLib/split_test.py | 150 |
1 files changed, 150 insertions, 0 deletions
diff --git a/Tests/designspaceLib/split_test.py b/Tests/designspaceLib/split_test.py new file mode 100644 index 00000000..8708f704 --- /dev/null +++ b/Tests/designspaceLib/split_test.py @@ -0,0 +1,150 @@ +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" + ) |