blob: c84b663720aec55b4cf6d8b5804ff1ef4605cd79 [file] [log] [blame]
#!/usr/bin/env python3
import sys, os, subprocess, shutil, glob
import xml.etree.ElementTree as ET
# Can we extract this from HTML element itself? I couldn't.
namespaces = {
"ft": "https://github.com/OpenType/fonttest",
"xlink": "http://www.w3.org/1999/xlink",
}
def ns(s):
ns, s = s.split(":")
return "{%s}%s" % (namespaces[ns], s)
def unistr(s):
return ",".join("U+%04X" % ord(c) for c in s)
def glyphstr(glyphs):
out = []
for glyphname, x, y in glyphs:
if x or y:
out.append("%s@%d,%d" % (glyphname, x, y))
else:
out.append(glyphname)
return "[" + "|".join(out) + "]"
def extract_tests(input):
html = ET.fromstring(input)
found = False
result = []
for elt in html.findall(".//*[@class='expected'][@ft:id]", namespaces):
found = True
name = elt.get(ns("ft:id"))
text = elt.get(ns("ft:render"))
font = elt.get(ns("ft:font"))
variations = elt.get(ns("ft:var"), "").replace(":", "=").replace(";", ",")
glyphs = []
for use in elt.findall(".//use"):
x = int(use.get("x"))
y = int(use.get("y"))
href = use.get(ns("xlink:href"))
assert href[0] == "#"
glyphname = ".".join(href[1:].split("/")[1].split(".")[1:])
glyphs.append((glyphname, x, y))
opts = "--font-size=1000 --ned --remove-default-ignorables"
if variations:
opts = opts + " --variations=%s" % variations
result.append(
"../fonts/%s;%s;%s;%s" % (font, opts, unistr(text), glyphstr(glyphs))
)
for elt in html.findall(".//*[@class='expected-no-crash'][@ft:id]", namespaces):
found = True
name = elt.get(ns("ft:id"))
text = elt.get(ns("ft:render"))
font = elt.get(ns("ft:font"))
variations = elt.get(ns("ft:var"), "").replace(":", "=").replace(";", ",")
opts = ""
if variations:
opts = "--variations=%s" % variations
result.append("../fonts/%s;%s;%s;*" % (font, opts, unistr(text)))
assert found
return "\n".join(result) + "\n"
os.chdir(os.getenv("srcdir", os.path.dirname(__file__)))
git = shutil.which("git")
assert git
if os.path.isdir("./text-rendering-tests"):
subprocess.run([git, "pull"], cwd="text-rendering-tests", check=True)
else:
subprocess.run(
[git, "clone", "https://github.com/unicode-org/text-rendering-tests"],
check=True,
)
shutil.rmtree("fonts", ignore_errors=True)
assert not os.path.exists("fonts")
shutil.copytree("text-rendering-tests/fonts", "fonts")
subprocess.run([git, "add", "fonts"], check=True)
shutil.rmtree("tests", ignore_errors=True)
assert not os.path.isdir("tests")
os.mkdir("tests")
with open("DISABLED", "r") as f:
disabled = f.read()
tests = []
disabled_tests = []
for x in sorted(os.listdir("text-rendering-tests/testcases")):
if not x.endswith(".html") or x == "index.html":
continue
out = "tests/%s.tests" % x.split(".html")[0]
with open("text-rendering-tests/testcases/" + x, "r") as f:
content = f.read()
with open(out, "w") as f:
f.write("@font-funcs=ot,ft\n")
f.write(extract_tests(content))
if out in disabled:
disabled_tests.append(out)
else:
tests.append(out)
subprocess.run([git, "add", "tests"], check=True)
with open("meson.build", "w") as f:
f.write(
"\n".join(
["text_rendering_tests_tests = ["]
+ [" '%s'," % x.split("tests/")[1] for x in tests]
+ ["]", "", "disabled_text_rendering_tests_tests = ["]
+ [" '%s'," % x.split("tests/")[1] for x in disabled_tests]
+ ["]", ""]
)
)
subprocess.run([git, "add", "meson.build"], check=True)
print(
'Updated the testsuit, now run `git commit -e -m "[test/text-rendering-tests] Update from upstream"`'
)