• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env python3
2
3import sys, os, subprocess, hashlib
4
5def shape_cmd(command):
6	global hb_shape, process
7	print (hb_shape + ' ' + " ".join(command))
8	process.stdin.write ((';'.join (command) + '\n').encode ("utf-8"))
9	process.stdin.flush ()
10	return process.stdout.readline().decode ("utf-8").strip ()
11
12args = sys.argv[1:]
13
14have_freetype = bool(int(os.getenv ('HAVE_FREETYPE', '1')))
15
16if not args or args[0].find('hb-shape') == -1 or not os.path.exists (args[0]):
17	sys.exit ("""First argument does not seem to point to usable hb-shape.""")
18hb_shape, args = args[0], args[1:]
19
20process = subprocess.Popen ([hb_shape, '--batch'],
21			    stdin=subprocess.PIPE,
22			    stdout=subprocess.PIPE,
23			    stderr=sys.stdout)
24
25passes = 0
26fails = 0
27skips = 0
28
29if not len (args):
30	args = ['-']
31
32for filename in args:
33	if filename == '-':
34		print ("Running tests from standard input")
35	else:
36		print ("Running tests in " + filename)
37
38	if filename == '-':
39		f = sys.stdin
40	else:
41		f = open (filename, encoding='utf8')
42
43	for line in f:
44		comment = False
45		if line.startswith ("#"):
46			comment = True
47			line = line[1:]
48
49			if line.startswith (' '):
50				print ("#%s" % line)
51				continue
52
53		line = line.strip ()
54		if not line:
55			continue
56
57		fontfile, options, unicodes, glyphs_expected = line.split (';')
58		options = options.split ()
59		if fontfile.startswith ('/') or fontfile.startswith ('"/'):
60			if os.name == 'nt': # Skip on Windows
61				continue
62
63			fontfile, expected_hash = (fontfile.split('@') + [''])[:2]
64
65			try:
66				with open (fontfile, 'rb') as ff:
67					if expected_hash:
68						actual_hash = hashlib.sha1 (ff.read()).hexdigest ().strip ()
69						if actual_hash != expected_hash:
70							print ('different version of %s found; Expected hash %s, got %s; skipping.' %
71								   (fontfile, expected_hash, actual_hash))
72							skips += 1
73							continue
74			except IOError:
75				print ('%s not found, skip.' % fontfile)
76				skips += 1
77				continue
78		else:
79			cwd = os.path.dirname(filename)
80			fontfile = os.path.normpath (os.path.join (cwd, fontfile))
81
82		extra_options = ["--shaper=ot"]
83		if glyphs_expected != '*':
84			extra_options.append("--verify")
85
86		if comment:
87			print ('# %s "%s" --unicodes %s' % (hb_shape, fontfile, unicodes))
88			continue
89
90		if "--font-funcs=ft" in options and not have_freetype:
91			skips += 1
92			continue
93
94		if "--font-funcs=ot" in options or not have_freetype:
95			glyphs1 = shape_cmd ([fontfile, "--font-funcs=ot"] + extra_options + ["--unicodes", unicodes] + options)
96		else:
97			glyphs1 = shape_cmd ([fontfile, "--font-funcs=ft"] + extra_options + ["--unicodes", unicodes] + options)
98			glyphs2 = shape_cmd ([fontfile, "--font-funcs=ot"] + extra_options + ["--unicodes", unicodes] + options)
99
100			if glyphs1 != glyphs2 and glyphs_expected != '*':
101				print ("FT funcs: " + glyphs1, file=sys.stderr)
102				print ("OT funcs: " + glyphs2, file=sys.stderr)
103				fails += 1
104			else:
105				passes += 1
106
107		if glyphs1.strip() != glyphs_expected and glyphs_expected != '*':
108			print ("Actual:   " + glyphs1, file=sys.stderr)
109			print ("Expected: " + glyphs_expected, file=sys.stderr)
110			fails += 1
111		else:
112			passes += 1
113
114print ("%d tests passed; %d failed; %d skipped." % (passes, fails, skips), file=sys.stderr)
115if not (fails + passes):
116	print ("No tests ran.")
117elif not (fails + skips):
118	print ("All tests passed.")
119
120if fails:
121	sys.exit (1)
122elif passes:
123	sys.exit (0)
124else:
125	sys.exit (77)
126