1cb93a386Sopenharmony_ci#!/usr/bin/env python3
2cb93a386Sopenharmony_ci
3cb93a386Sopenharmony_ci# Pre-generates the expected output subset files (via fonttools) for
4cb93a386Sopenharmony_ci# specified subset test suite(s).
5cb93a386Sopenharmony_ci
6cb93a386Sopenharmony_ciimport os
7cb93a386Sopenharmony_ciimport sys
8cb93a386Sopenharmony_ciimport shutil
9cb93a386Sopenharmony_ciimport io
10cb93a386Sopenharmony_ciimport re
11cb93a386Sopenharmony_ciimport tempfile
12cb93a386Sopenharmony_ci
13cb93a386Sopenharmony_cifrom difflib import unified_diff
14cb93a386Sopenharmony_cifrom fontTools.ttLib import TTFont
15cb93a386Sopenharmony_ci
16cb93a386Sopenharmony_cifrom subprocess import check_call
17cb93a386Sopenharmony_cifrom subset_test_suite import SubsetTestSuite
18cb93a386Sopenharmony_ci
19cb93a386Sopenharmony_ci
20cb93a386Sopenharmony_cidef usage():
21cb93a386Sopenharmony_ci	print("Usage: generate-expected-outputs.py hb-subset <test suite file> ...")
22cb93a386Sopenharmony_ci
23cb93a386Sopenharmony_ci
24cb93a386Sopenharmony_cidef strip_check_sum (ttx_string):
25cb93a386Sopenharmony_ci	return re.sub ('checkSumAdjustment value=["]0x([0-9a-fA-F])+["]',
26cb93a386Sopenharmony_ci		       'checkSumAdjustment value="0x00000000"',
27cb93a386Sopenharmony_ci		       ttx_string, count=1)
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ci
30cb93a386Sopenharmony_cidef generate_expected_output(input_file, unicodes, profile_flags, output_directory, font_name):
31cb93a386Sopenharmony_ci	fonttools_path = os.path.join(tempfile.mkdtemp (), font_name)
32cb93a386Sopenharmony_ci	args = ["fonttools", "subset", input_file]
33cb93a386Sopenharmony_ci	args.extend(["--drop-tables+=DSIG",
34cb93a386Sopenharmony_ci		     "--drop-tables-=sbix",
35cb93a386Sopenharmony_ci		     "--unicodes=%s" % unicodes,
36cb93a386Sopenharmony_ci		     "--output-file=%s" % fonttools_path])
37cb93a386Sopenharmony_ci	args.extend(profile_flags)
38cb93a386Sopenharmony_ci	check_call(args)
39cb93a386Sopenharmony_ci	with io.StringIO () as fp:
40cb93a386Sopenharmony_ci		with TTFont (fonttools_path) as font:
41cb93a386Sopenharmony_ci			font.saveXML (fp)
42cb93a386Sopenharmony_ci		fonttools_ttx = strip_check_sum (fp.getvalue ())
43cb93a386Sopenharmony_ci
44cb93a386Sopenharmony_ci	harfbuzz_path = os.path.join(tempfile.mkdtemp (), font_name)
45cb93a386Sopenharmony_ci	args = [
46cb93a386Sopenharmony_ci		hb_subset,
47cb93a386Sopenharmony_ci		"--font-file=" + input_file,
48cb93a386Sopenharmony_ci		"--output-file=" + harfbuzz_path,
49cb93a386Sopenharmony_ci		"--unicodes=%s" % unicodes,
50cb93a386Sopenharmony_ci		"--drop-tables+=DSIG",
51cb93a386Sopenharmony_ci		"--drop-tables-=sbix"]
52cb93a386Sopenharmony_ci	args.extend(profile_flags)
53cb93a386Sopenharmony_ci	check_call(args)
54cb93a386Sopenharmony_ci	with io.StringIO () as fp:
55cb93a386Sopenharmony_ci		with TTFont (harfbuzz_path) as font:
56cb93a386Sopenharmony_ci			font.saveXML (fp)
57cb93a386Sopenharmony_ci		harfbuzz_ttx = strip_check_sum (fp.getvalue ())
58cb93a386Sopenharmony_ci
59cb93a386Sopenharmony_ci	if harfbuzz_ttx != fonttools_ttx:
60cb93a386Sopenharmony_ci		for line in unified_diff (fonttools_ttx.splitlines (1), harfbuzz_ttx.splitlines (1), fonttools_path, harfbuzz_path):
61cb93a386Sopenharmony_ci			sys.stdout.write (line)
62cb93a386Sopenharmony_ci		sys.stdout.flush ()
63cb93a386Sopenharmony_ci		raise Exception ('ttx for fonttools and harfbuzz does not match.')
64cb93a386Sopenharmony_ci
65cb93a386Sopenharmony_ci	output_path = os.path.join(output_directory, font_name)
66cb93a386Sopenharmony_ci	shutil.copy(harfbuzz_path, output_path)
67cb93a386Sopenharmony_ci
68cb93a386Sopenharmony_ci
69cb93a386Sopenharmony_ciargs = sys.argv[1:]
70cb93a386Sopenharmony_ciif not args:
71cb93a386Sopenharmony_ci	usage()
72cb93a386Sopenharmony_cihb_subset, args = args[0], args[1:]
73cb93a386Sopenharmony_ciif not args:
74cb93a386Sopenharmony_ci	usage()
75cb93a386Sopenharmony_ci
76cb93a386Sopenharmony_cifor path in args:
77cb93a386Sopenharmony_ci	with open(path, mode="r", encoding="utf-8") as f:
78cb93a386Sopenharmony_ci		test_suite = SubsetTestSuite(path, f.read())
79cb93a386Sopenharmony_ci		output_directory = test_suite.get_output_directory()
80cb93a386Sopenharmony_ci
81cb93a386Sopenharmony_ci		print("Generating output files for %s" % output_directory)
82cb93a386Sopenharmony_ci		for test in test_suite.tests():
83cb93a386Sopenharmony_ci			unicodes = test.unicodes()
84cb93a386Sopenharmony_ci			font_name = test.get_font_name()
85cb93a386Sopenharmony_ci			print("Creating subset %s/%s" % (output_directory, font_name))
86cb93a386Sopenharmony_ci			generate_expected_output(test.font_path, unicodes, test.get_profile_flags(),
87cb93a386Sopenharmony_ci						 output_directory, font_name)
88