blob: c3dddc05a9cf970c2c6c7107f8329daa90aecc51 [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/json5-tests'))
suffix_implies_success = {
'.json': True,
'.json5': True,
'.txt': False,
}
if __name__ == '__main__':
basicConfig(level=INFO)
logger = getLogger(__name__)
init()
if name != 'nt':
code_severe = Fore.RED + '😱'
code_good = Fore.CYAN + '😄'
code_bad = Fore.YELLOW + '😠'
else:
code_severe = Fore.RED + 'SEVERE'
code_good = Fore.CYAN + 'GOOD'
code_bad = Fore.YELLOW + 'BAD'
good = 0
bad = 0
severe = 0
args = argparser.parse_args()
index = 0
for path in sorted(args.tests.glob('*/*.*')):
kind = path.suffix.split('.')[-1]
expect_success = suffix_implies_success.get(path.suffix)
if expect_success is None:
continue
index += 1
category = path.parent.name
name = path.stem
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)
severe += 1
continue
is_success = outcome == 0
is_failure = outcome == 1
is_severe = outcome not in (0, 1)
is_good = is_success if expect_success else is_failure
code = code_severe if is_severe else code_good if is_good else code_bad
print(
'#', index, ' ', code, ' '
'Category <', category, '> | '
'Test <', name, '> | '
'Data <', kind, '> | '
'Expected <', 'pass' if expect_success else 'FAIL', '> | '
'Actual <', 'pass' if is_success else 'FAIL', '>',
Fore.RESET,
sep='',
)
if is_severe:
severe += 1
elif is_good:
good += 1
else:
bad += 1
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 outcome | ',
bad, ' × wrong outcome | ',
severe, ' × severe errors',
Fore.RESET,
sep=''
)
raise SystemExit(2 if is_severe else 0 if is_good else 1)