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