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" )