#!/usr/bin/env python # ignore-tidy-linelength import sys import os import subprocess import argparse # usage: testparser.py [-h] [-p PARSER [PARSER ...]] -s SOURCE_DIR # Parsers should read from stdin and return exit status 0 for a # successful parse, and nonzero for an unsuccessful parse parser = argparse.ArgumentParser() parser.add_argument('-p', '--parser', nargs='+') parser.add_argument('-s', '--source-dir', nargs=1, required=True) args = parser.parse_args(sys.argv[1:]) total = 0 ok = {} bad = {} for parser in args.parser: ok[parser] = 0 bad[parser] = [] devnull = open(os.devnull, 'w') print("\n") for base, dirs, files in os.walk(args.source_dir[0]): for f in filter(lambda p: p.endswith('.rs'), files): p = os.path.join(base, f) parse_fail = 'parse-fail' in p if sys.version_info.major == 3: lines = open(p, encoding='utf-8').readlines() else: lines = open(p).readlines() if any('ignore-test' in line or 'ignore-lexer-test' in line for line in lines): continue total += 1 for parser in args.parser: if subprocess.call(parser, stdin=open(p), stderr=subprocess.STDOUT, stdout=devnull) == 0: if parse_fail: bad[parser].append(p) else: ok[parser] += 1 else: if parse_fail: ok[parser] += 1 else: bad[parser].append(p) parser_stats = ', '.join(['{}: {}'.format(parser, ok[parser]) for parser in args.parser]) sys.stdout.write("\033[K\r total: {}, {}, scanned {}" .format(total, os.path.relpath(parser_stats), os.path.relpath(p))) devnull.close() print("\n") for parser in args.parser: filename = os.path.basename(parser) + '.bad' print("writing {} files that did not yield the correct result with {} to {}".format(len(bad[parser]), parser, filename)) with open(filename, "w") as f: for p in bad[parser]: f.write(p) f.write("\n")