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