blob: 654ff250705afe762cbb0660e574be04f6de21e6 [file] [log] [blame]
#!/usr/bin/env python
from argparse import ArgumentParser
from logging import basicConfig, INFO, getLogger
from os import name
from pathlib import Path
from subprocess import Popen
from sys import executable
from colorama import init, Fore
from pyjson5 import decode_io
argparser = ArgumentParser(description="Run JSON5 parser tests")
argparser.add_argument(
"tests",
nargs="?",
type=Path,
default=Path("third-party/JSONTestSuite/test_parsing"),
)
suffix_implies_success = {
"json": True,
"json5": True,
"txt": False,
}
if __name__ == "__main__":
basicConfig(level=INFO)
logger = getLogger(__name__)
init()
good = bad = severe = 0
if name != "nt":
code_severe = Fore.RED + "😱"
code_good = Fore.CYAN + "😄"
code_bad = Fore.YELLOW + "😠"
code_ignored = Fore.BLUE + "🙅"
else:
code_severe = Fore.RED + "SEVERE"
code_good = Fore.CYAN + "GOOD"
code_bad = Fore.YELLOW + "BAD"
code_ignored = Fore.BLUE + "IGNORED"
args = argparser.parse_args()
index = 0
for path in sorted(args.tests.glob("?_?*.json")):
category, name = path.stem.split("_", 1)
if category not in "yni":
continue
if category in "ni":
# ignore anything but tests that are expected to pass for now
continue
try:
# ignore any UTF-8 errors
with open(str(path.resolve()), "rt") as f:
f.read()
except Exception:
continue
index += 1
try:
p = Popen((executable, "transcode-to-json.py", str(path)))
outcome = p.wait(5)
except Exception:
logger.error("Error while testing: %s", path, exc_info=True)
errors += 1
continue
if outcome not in (0, 1):
code = code_severe
severe += 1
elif category == "y":
if outcome == 0:
code = code_good
good += 1
else:
code = code_bad
bad += 1
else:
code = code_ignored
print(
"#",
index,
" ",
code,
" | " "Category <",
category,
"> | " "Test <",
name,
"> | " "Actual <",
"pass" if outcome == 0 else "FAIL",
">",
Fore.RESET,
sep="",
)
is_severe = severe > 0
is_good = bad == 0
code = code_severe if is_severe else code_good if is_good else code_bad
print()
print(
code,
" | ",
good,
" correct outcomes | ",
bad,
" wrong outcomes | ",
severe,
" severe errors",
Fore.RESET,
sep="",
)
raise SystemExit(2 if is_severe else 0 if is_good else 1)