aboutsummaryrefslogtreecommitdiff
path: root/Tests/designspaceLib/split_test.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/designspaceLib/split_test.py')
-rw-r--r--Tests/designspaceLib/split_test.py150
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"
+ )