parent
6e9468fcfb
commit
b8b8c58b9f
13 changed files with 498 additions and 1 deletions
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 |
@ -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