#!/usr/bin/env python3

# Pre-generates the expected output subset files (via fonttools) for
# specified subset test suite(s).

import io
import os
import sys

from subprocess import check_call
from subset_test_suite import SubsetTestSuite


def usage():
	print("Usage: generate-expected-outputs.py <test suite file> ...")


def generate_expected_output(input_file, unicodes, profile_flags, output_path):
	args = ["fonttools", "subset", input_file]
	args.extend(["--notdef-outline",
		     "--layout-features=*",
		     "--drop-tables+=DSIG,GPOS,GSUB,GDEF",
		     "--drop-tables-=sbix",
		     "--unicodes=%s" % unicodes,
		     "--output-file=%s" % output_path])
	args.extend(profile_flags)
	check_call(args)


args = sys.argv[1:]
if not args:
	usage()

for path in args:
	with io.open(path, mode="r", encoding="utf-8") as f:
		test_suite = SubsetTestSuite(path, f.read())
		output_directory = test_suite.get_output_directory()

		print("Generating output files for %s" % output_directory)
		for test in test_suite.tests():
			unicodes = test.unicodes()
			font_name = test.get_font_name()
			print("Creating subset %s/%s" % (output_directory, font_name))
			generate_expected_output(test.font_path, unicodes, test.get_profile_flags(),
						 os.path.join(output_directory,
							      font_name))
