[subset] add tests that check for successful repacking of a real font file.
This commit is contained in:
parent
6e9468fcfb
commit
b8b8c58b9f
|
@ -432,6 +432,7 @@ test/shaping/data/in-house/Makefile
|
||||||
test/shaping/data/text-rendering-tests/Makefile
|
test/shaping/data/text-rendering-tests/Makefile
|
||||||
test/subset/Makefile
|
test/subset/Makefile
|
||||||
test/subset/data/Makefile
|
test/subset/data/Makefile
|
||||||
|
test/subset/data/repack_tests/Makefile
|
||||||
docs/Makefile
|
docs/Makefile
|
||||||
docs/version.xml
|
docs/version.xml
|
||||||
])
|
])
|
||||||
|
|
|
@ -13,7 +13,9 @@ libs:
|
||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
meson.build \
|
meson.build \
|
||||||
run-tests.py \
|
run-tests.py \
|
||||||
|
run-repack-tests.py \
|
||||||
subset_test_suite.py \
|
subset_test_suite.py \
|
||||||
|
repack_test.py \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
CLEANFILES += \
|
CLEANFILES += \
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
NULL =
|
NULL =
|
||||||
EXTRA_DIST =
|
EXTRA_DIST =
|
||||||
CLEANFILES =
|
CLEANFILES =
|
||||||
SUBDIRS =
|
SUBDIRS = repack_tests
|
||||||
|
|
||||||
EXTRA_DIST += \
|
EXTRA_DIST += \
|
||||||
$(TESTS) \
|
$(TESTS) \
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,22 @@
|
||||||
|
# Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
NULL =
|
||||||
|
EXTRA_DIST =
|
||||||
|
CLEANFILES =
|
||||||
|
SUBDIRS =
|
||||||
|
|
||||||
|
EXTRA_DIST +=
|
||||||
|
$(TESTS) \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
# Convenience targets:
|
||||||
|
lib: libs # Always build subsetter lib in this subdir
|
||||||
|
libs:
|
||||||
|
@$(MAKE) $(AM_MAKEFLAGS) -C $(top_builddir)/src libs
|
||||||
|
|
||||||
|
TEST_EXTENSIONS = .tests
|
||||||
|
TESTS_LOG_COMPILER = $(srcdir)/../../run-repack-tests.py $(top_builddir)/util/hb-subset$(EXEEXT)
|
||||||
|
include Makefile.sources
|
||||||
|
|
||||||
|
|
||||||
|
-include $(top_srcdir)/git.mk
|
|
@ -0,0 +1,12 @@
|
||||||
|
TESTS = \
|
||||||
|
basic.tests \
|
||||||
|
prioritization.tests \
|
||||||
|
table_duplication.tests \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
XFAIL_TESTS = \
|
||||||
|
advanced_prioritization.tests \
|
||||||
|
$(NULL)
|
||||||
|
|
||||||
|
DISABLED_TESTS = \
|
||||||
|
$(NULL)
|
|
@ -0,0 +1,72 @@
|
||||||
|
NotoNastaliqUrdu-Bold.ttf
|
||||||
|
0x0020
|
||||||
|
0x0028
|
||||||
|
0x0029
|
||||||
|
0x002C
|
||||||
|
0x002D
|
||||||
|
0x002E
|
||||||
|
0x0030
|
||||||
|
0x0031
|
||||||
|
0x0032
|
||||||
|
0x0033
|
||||||
|
0x0034
|
||||||
|
0x0035
|
||||||
|
0x0036
|
||||||
|
0x0037
|
||||||
|
0x0038
|
||||||
|
0x0039
|
||||||
|
0x003A
|
||||||
|
0x060C
|
||||||
|
0x061F
|
||||||
|
0x0621
|
||||||
|
0x0622
|
||||||
|
0x0623
|
||||||
|
0x0624
|
||||||
|
0x0625
|
||||||
|
0x0626
|
||||||
|
0x0627
|
||||||
|
0x0628
|
||||||
|
0x0629
|
||||||
|
0x062A
|
||||||
|
0x062B
|
||||||
|
0x062C
|
||||||
|
0x062D
|
||||||
|
0x062E
|
||||||
|
0x062F
|
||||||
|
0x0630
|
||||||
|
0x0631
|
||||||
|
0x0632
|
||||||
|
0x0633
|
||||||
|
0x0634
|
||||||
|
0x0635
|
||||||
|
0x0636
|
||||||
|
0x0637
|
||||||
|
0x0638
|
||||||
|
0x0639
|
||||||
|
0x063A
|
||||||
|
0x0640
|
||||||
|
0x0641
|
||||||
|
0x0642
|
||||||
|
0x0643
|
||||||
|
0x0644
|
||||||
|
0x0645
|
||||||
|
0x0646
|
||||||
|
0x0647
|
||||||
|
0x0648
|
||||||
|
0x0649
|
||||||
|
0x064A
|
||||||
|
0x064B
|
||||||
|
0x064C
|
||||||
|
0x064F
|
||||||
|
0x0651
|
||||||
|
0x067E
|
||||||
|
0x0686
|
||||||
|
0x0698
|
||||||
|
0x06A9
|
||||||
|
0x06AF
|
||||||
|
0x06BE
|
||||||
|
0x06CC
|
||||||
|
0x200C
|
||||||
|
0x200D
|
||||||
|
0x200E
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
NotoNastaliqUrdu-Bold.ttf
|
||||||
|
0x060C
|
||||||
|
0x061F
|
||||||
|
0x0621
|
||||||
|
0x0622
|
||||||
|
0x0623
|
||||||
|
0x0624
|
||||||
|
0x0625
|
||||||
|
0x0626
|
||||||
|
0x0627
|
||||||
|
0x0628
|
||||||
|
0x0629
|
||||||
|
0x062A
|
||||||
|
0x062B
|
||||||
|
0x062C
|
||||||
|
0x062D
|
||||||
|
0x062E
|
||||||
|
0x062F
|
||||||
|
0x0630
|
||||||
|
0x0631
|
||||||
|
0x0632
|
||||||
|
0x0633
|
||||||
|
0x0634
|
||||||
|
0x0635
|
||||||
|
0x0636
|
||||||
|
0x0637
|
||||||
|
0x0638
|
||||||
|
0x0639
|
||||||
|
0x063A
|
||||||
|
0x0640
|
||||||
|
0x0641
|
||||||
|
0x0642
|
||||||
|
0x0643
|
||||||
|
0x0644
|
||||||
|
0x0645
|
||||||
|
0x0646
|
||||||
|
0x0647
|
||||||
|
0x0648
|
||||||
|
0x0649
|
||||||
|
0x064A
|
||||||
|
0x064B
|
||||||
|
0x064F
|
||||||
|
0x0651
|
||||||
|
0x067E
|
||||||
|
0x0686
|
||||||
|
0x0698
|
||||||
|
0x06A9
|
||||||
|
0x06AF
|
||||||
|
0x06CC
|
||||||
|
0x200C
|
||||||
|
0x200D
|
||||||
|
0x200E
|
|
@ -0,0 +1,77 @@
|
||||||
|
NotoNastaliqUrdu-Bold.ttf
|
||||||
|
0x0020
|
||||||
|
0x0028
|
||||||
|
0x0029
|
||||||
|
0x002C
|
||||||
|
0x002D
|
||||||
|
0x002E
|
||||||
|
0x0030
|
||||||
|
0x0031
|
||||||
|
0x0032
|
||||||
|
0x0033
|
||||||
|
0x0034
|
||||||
|
0x0035
|
||||||
|
0x0036
|
||||||
|
0x0037
|
||||||
|
0x0038
|
||||||
|
0x0039
|
||||||
|
0x003A
|
||||||
|
0x060C
|
||||||
|
0x061F
|
||||||
|
0x0621
|
||||||
|
0x0622
|
||||||
|
0x0623
|
||||||
|
0x0624
|
||||||
|
0x0625
|
||||||
|
0x0626
|
||||||
|
0x0627
|
||||||
|
0x0628
|
||||||
|
0x0629
|
||||||
|
0x062A
|
||||||
|
0x062B
|
||||||
|
0x062C
|
||||||
|
0x062D
|
||||||
|
0x062E
|
||||||
|
0x062F
|
||||||
|
0x0630
|
||||||
|
0x0631
|
||||||
|
0x0632
|
||||||
|
0x0633
|
||||||
|
0x0634
|
||||||
|
0x0635
|
||||||
|
0x0636
|
||||||
|
0x0637
|
||||||
|
0x0638
|
||||||
|
0x0639
|
||||||
|
0x063A
|
||||||
|
0x0640
|
||||||
|
0x0641
|
||||||
|
0x0642
|
||||||
|
0x0643
|
||||||
|
0x0644
|
||||||
|
0x0645
|
||||||
|
0x0646
|
||||||
|
0x0647
|
||||||
|
0x0648
|
||||||
|
0x0649
|
||||||
|
0x064A
|
||||||
|
0x064B
|
||||||
|
0x064F
|
||||||
|
0x0651
|
||||||
|
0x0653
|
||||||
|
0x0679
|
||||||
|
0x067E
|
||||||
|
0x0686
|
||||||
|
0x0688
|
||||||
|
0x0691
|
||||||
|
0x0698
|
||||||
|
0x06A9
|
||||||
|
0x06AF
|
||||||
|
0x06BA
|
||||||
|
0x06BE
|
||||||
|
0x06C1
|
||||||
|
0x06CC
|
||||||
|
0x06D2
|
||||||
|
0x200C
|
||||||
|
0x200D
|
||||||
|
0x200E
|
|
@ -0,0 +1,97 @@
|
||||||
|
NotoNastaliqUrdu-Bold.ttf
|
||||||
|
0x0028
|
||||||
|
0x0029
|
||||||
|
0x002C
|
||||||
|
0x002D
|
||||||
|
0x002E
|
||||||
|
0x0030
|
||||||
|
0x0031
|
||||||
|
0x0032
|
||||||
|
0x0033
|
||||||
|
0x0034
|
||||||
|
0x0035
|
||||||
|
0x0036
|
||||||
|
0x0037
|
||||||
|
0x0038
|
||||||
|
0x0039
|
||||||
|
0x003A
|
||||||
|
0x0041
|
||||||
|
0x0042
|
||||||
|
0x0043
|
||||||
|
0x0044
|
||||||
|
0x0045
|
||||||
|
0x0046
|
||||||
|
0x0047
|
||||||
|
0x0048
|
||||||
|
0x0049
|
||||||
|
0x004C
|
||||||
|
0x004D
|
||||||
|
0x004E
|
||||||
|
0x004F
|
||||||
|
0x0050
|
||||||
|
0x0052
|
||||||
|
0x0053
|
||||||
|
0x0054
|
||||||
|
0x0055
|
||||||
|
0x0056
|
||||||
|
0x0057
|
||||||
|
0x0061
|
||||||
|
0x0062
|
||||||
|
0x0063
|
||||||
|
0x0064
|
||||||
|
0x0065
|
||||||
|
0x0066
|
||||||
|
0x0067
|
||||||
|
0x0068
|
||||||
|
0x0069
|
||||||
|
0x006B
|
||||||
|
0x006C
|
||||||
|
0x006D
|
||||||
|
0x006E
|
||||||
|
0x006F
|
||||||
|
0x0070
|
||||||
|
0x0072
|
||||||
|
0x0073
|
||||||
|
0x0074
|
||||||
|
0x0075
|
||||||
|
0x0076
|
||||||
|
0x0077
|
||||||
|
0x0078
|
||||||
|
0x0079
|
||||||
|
0x060C
|
||||||
|
0x0626
|
||||||
|
0x0627
|
||||||
|
0x0628
|
||||||
|
0x062A
|
||||||
|
0x062C
|
||||||
|
0x062D
|
||||||
|
0x062E
|
||||||
|
0x062F
|
||||||
|
0x0631
|
||||||
|
0x0632
|
||||||
|
0x0633
|
||||||
|
0x0634
|
||||||
|
0x0635
|
||||||
|
0x0636
|
||||||
|
0x0637
|
||||||
|
0x0638
|
||||||
|
0x0639
|
||||||
|
0x0641
|
||||||
|
0x0642
|
||||||
|
0x0644
|
||||||
|
0x0645
|
||||||
|
0x0646
|
||||||
|
0x0648
|
||||||
|
0x0653
|
||||||
|
0x0679
|
||||||
|
0x067E
|
||||||
|
0x0686
|
||||||
|
0x0688
|
||||||
|
0x0691
|
||||||
|
0x06A9
|
||||||
|
0x06AF
|
||||||
|
0x06BA
|
||||||
|
0x06BE
|
||||||
|
0x06C1
|
||||||
|
0x06CC
|
||||||
|
0x06D2
|
|
@ -28,6 +28,13 @@ tests = [
|
||||||
'cbdt',
|
'cbdt',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
repack_tests = [
|
||||||
|
'basic',
|
||||||
|
'prioritization',
|
||||||
|
'table_duplication',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
run_test = find_program('run-tests.py')
|
run_test = find_program('run-tests.py')
|
||||||
|
|
||||||
foreach t : tests
|
foreach t : tests
|
||||||
|
@ -45,3 +52,18 @@ foreach t : tests
|
||||||
suite: ['subset', 'slow'],
|
suite: ['subset', 'slow'],
|
||||||
)
|
)
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
|
run_repack_test = find_program('run-repack-tests.py')
|
||||||
|
|
||||||
|
foreach t : repack_tests
|
||||||
|
fname = '@0@.tests'.format(t)
|
||||||
|
|
||||||
|
test(t, run_repack_test,
|
||||||
|
args: [
|
||||||
|
hb_subset,
|
||||||
|
join_paths(meson.current_source_dir(), 'data', 'repack_tests', fname),
|
||||||
|
],
|
||||||
|
workdir: join_paths(meson.current_build_dir(), '..', '..'),
|
||||||
|
suite: ['subset', 'repack'],
|
||||||
|
)
|
||||||
|
endforeach
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
# Parses a single repacking test file. The first line of the file is
|
||||||
|
# the name of the font to use and the remaining lines define the set of
|
||||||
|
# codepoints in the subset.
|
||||||
|
class RepackTest:
|
||||||
|
|
||||||
|
def __init__(self, test_path, definition):
|
||||||
|
self.test_path = test_path
|
||||||
|
self.font_name = None
|
||||||
|
self.codepoints = set ()
|
||||||
|
self._parse(definition)
|
||||||
|
|
||||||
|
def font_path(self):
|
||||||
|
return os.path.join (self._base_path (), "fonts", self.font_name)
|
||||||
|
|
||||||
|
def codepoints_string (self):
|
||||||
|
return ",".join (self.codepoints)
|
||||||
|
|
||||||
|
def _base_path(self):
|
||||||
|
return os.path.join(
|
||||||
|
os.path.dirname(self.test_path),
|
||||||
|
"../")
|
||||||
|
|
||||||
|
|
||||||
|
def _parse(self, definition):
|
||||||
|
lines = definition.splitlines ()
|
||||||
|
self.font_name = lines.pop (0)
|
||||||
|
for line in lines:
|
||||||
|
line = line.strip()
|
||||||
|
if not line:
|
||||||
|
continue
|
||||||
|
|
||||||
|
self.codepoints.add (line)
|
|
@ -0,0 +1,104 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
# Runs a subsetting test suite. Compares the results of subsetting via harfbuzz
|
||||||
|
# to subsetting via fonttools.
|
||||||
|
|
||||||
|
from difflib import unified_diff
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import tempfile
|
||||||
|
import shutil
|
||||||
|
import io
|
||||||
|
|
||||||
|
from repack_test import RepackTest
|
||||||
|
|
||||||
|
try:
|
||||||
|
from fontTools.ttLib import TTFont
|
||||||
|
except ImportError:
|
||||||
|
print ("fonttools is not present, skipping test.")
|
||||||
|
sys.exit (77)
|
||||||
|
|
||||||
|
ots_sanitize = shutil.which ("ots-sanitize")
|
||||||
|
|
||||||
|
def cmd (command):
|
||||||
|
p = subprocess.Popen (
|
||||||
|
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
|
||||||
|
universal_newlines=True)
|
||||||
|
(stdoutdata, stderrdata) = p.communicate ()
|
||||||
|
print (stderrdata, end="", file=sys.stderr)
|
||||||
|
return stdoutdata, p.returncode
|
||||||
|
|
||||||
|
def fail_test (test, cli_args, message):
|
||||||
|
print ('ERROR: %s' % message)
|
||||||
|
print ('Test State:')
|
||||||
|
print (' test.font_name %s' % test.font_name)
|
||||||
|
print (' test.test_path %s' % os.path.abspath (test.test_path))
|
||||||
|
return 1
|
||||||
|
|
||||||
|
def run_test (test, should_check_ots):
|
||||||
|
out_file = os.path.join (tempfile.mkdtemp (), test.font_name + '-subset.ttf')
|
||||||
|
cli_args = [hb_subset,
|
||||||
|
"--font-file=" + test.font_path (),
|
||||||
|
"--output-file=" + out_file,
|
||||||
|
"--unicodes=%s" % test.codepoints_string (),
|
||||||
|
"--drop-tables-=GPOS,GSUB,GDEF",]
|
||||||
|
print (' '.join (cli_args))
|
||||||
|
_, return_code = cmd (cli_args)
|
||||||
|
|
||||||
|
if return_code:
|
||||||
|
return fail_test (test, cli_args, "%s returned %d" % (' '.join (cli_args), return_code))
|
||||||
|
|
||||||
|
try:
|
||||||
|
with TTFont (out_file) as font:
|
||||||
|
pass
|
||||||
|
except Exception as e:
|
||||||
|
print (e)
|
||||||
|
return fail_test (test, cli_args, "ttx failed to parse the result")
|
||||||
|
|
||||||
|
if should_check_ots:
|
||||||
|
print ("Checking output with ots-sanitize.")
|
||||||
|
if not check_ots (out_file):
|
||||||
|
return fail_test (test, cli_args, 'ots for subsetted file fails.')
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def has_ots ():
|
||||||
|
if not ots_sanitize:
|
||||||
|
print ("OTS is not present, skipping all ots checks.")
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
def check_ots (path):
|
||||||
|
ots_report, returncode = cmd ([ots_sanitize, path])
|
||||||
|
if returncode:
|
||||||
|
print ("OTS Failure: %s" % ots_report)
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
args = sys.argv[1:]
|
||||||
|
if not args or sys.argv[1].find ('hb-subset') == -1 or not os.path.exists (sys.argv[1]):
|
||||||
|
sys.exit ("First argument does not seem to point to usable hb-subset.")
|
||||||
|
hb_subset, args = args[0], args[1:]
|
||||||
|
|
||||||
|
if len (args) != 1:
|
||||||
|
sys.exit ("No tests supplied.")
|
||||||
|
|
||||||
|
has_ots = has_ots()
|
||||||
|
|
||||||
|
fails = 0
|
||||||
|
|
||||||
|
path = args[0]
|
||||||
|
if not path.endswith(".tests"):
|
||||||
|
sys.exit ("Not a valid test case path.")
|
||||||
|
|
||||||
|
with open (path, mode="r", encoding="utf-8") as f:
|
||||||
|
# TODO(garretrieger): re-enable OTS checking.
|
||||||
|
fails += run_test (RepackTest (path, f.read ()), False)
|
||||||
|
|
||||||
|
|
||||||
|
if fails != 0:
|
||||||
|
sys.exit ("%d test(s) failed." % fails)
|
||||||
|
else:
|
||||||
|
print ("All tests passed.")
|
Loading…
Reference in New Issue